package org.suanfaTranning.ST200_Chatpter1_LineTable_HashTable_String.array;

import java.util.HashMap;
import java.util.Map;

/**
 * @author Fql18
 * @Auther: qingle
 * @Date: 2024/9/9-22:46
 * @Description:1/4 K 个不同整数的子数组
 * 给定一个正整数数组 A，如果 A 的某个子数组中不同整数的个数恰好为 K，则称 A 的这个连续、不一定独立的子数组为好子数组。
 *
 * （例如，[1,2,3,1,2] 中有 3 个不同的整数：1，2，以及 3。）
 *
 * 返回 A 中好子数组的数目。
 *
 * 示例 1：
 *
 * 输入：A = [1,2,1,2,3], K = 2
 * 输出：7
 * 解释：恰好由 2 个不同整数组成的子数组：[1,2], [2,1], [1,2], [2,3], [1,2,1], [2,1,2], [1,2,1,2].
 * 示例 2：
 *
 * 输入：A = [1,2,1,3,4], K = 3
 * 输出：3
 * 解释：恰好由 3 个不同整数组成的子数组：[1,2,1,3], [2,1,3], [1,3,4].
 *
 * 提示：
 *
 * 1 <= A.length <= 20000
 * 1 <= A[i] <= A.length
 * 1 <= K <= A.length
 * @version: 1.0
 */
public class Array01_gpt {
		public int subarraysWithKDistinct(int[] A, int K) {
			return atMostKDistinct(A, K) - atMostKDistinct(A, K - 1);
		}

		private int atMostKDistinct(int[] A, int K) {
			int count = 0;
			int left = 0;
			Map<Integer, Integer> map = new HashMap<>();

			for (int right = 0; right < A.length; right++) {
				map.put(A[right], map.getOrDefault(A[right], 0) + 1);

				while (map.size() > K) {
					map.put(A[left], map.get(A[left]) - 1);
					if (map.get(A[left]) == 0) {
						map.remove(A[left]);
					}
					left++;
				}

				count += (right - left + 1);
			}
			return count;
		}

		public static void main(String[] args) {
			Array01_gpt solution = new Array01_gpt();
			int[] A1 = {1, 2, 1, 2, 3};
			int K1 = 2;
			System.out.println(solution.subarraysWithKDistinct(A1, K1)); // 输出 7

			int[] A2 = {1, 2, 1, 3, 4};
			int K2 = 3;
			System.out.println(solution.subarraysWithKDistinct(A2, K2)); // 输出 3
		}
	}